package com.wei.czz.framework.blog.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wei.czz.common.dto.blog.BlogDto;
import com.wei.czz.common.dto.blog.SortBlogDto;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.vo.blog.IndexVo;
import com.wei.czz.common.vo.blog.SortVo;
import com.wei.czz.common.vo.blog.TagSortVo;
import com.wei.czz.common.vo.blog.BlogFormVo;
import com.wei.czz.framework.blog.entity.BlogEntity;
import com.wei.czz.framework.blog.entity.BlogIssueEntity;

import java.util.Date;
import java.util.List;


/**
 * Created by IntelliJ IDEA.
 *
 * @author wei
 * date: 2022-02-20 14:10:03
 * className: BlogIssueService 系统已发布博客操作请求服务接口
 * version: 1.0
 * description:
 */
public interface BlogIssueService {

    /**
     * 保存已发布博客操作
     * @param issueBlog 博客发布对象
     */
    void insert(BlogIssueEntity issueBlog);

    /**
     * 获取已发布博客操作
     * @param blogId 博客主键
     * @return 已发布博客对象
     */
    BlogIssueEntity getBlogIssue(Long blogId);

    /**
     * 获取用户已发布博客操作
     * @param userId    用户主键
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return 用户已发布博客列表
     */
    List<BlogIssueEntity> getUserIssueBlogList(Long userId, Date startDate, Date endDate);

    /**
     * 分页获取博客标签关联的已发布博客列表操作
     * @param tagSortVo 参数对象
     * @return 博客列表
     */
    PageDto<BlogEntity> getTagBlogPageList(TagSortVo tagSortVo);

    /**
     * 获取所有系统已发布博客的博客id操作
     * @return 博客id列表
     */
    List<Long> getIssueBlogIdList();

    /**
     * 分页获取浏览器首页面展示的博客列表
     * @param page    mp分页对象
     * @param indexVo 请求参数封装对象
     * @return 博客列表
     */
    Page<BlogDto> getIndexBlogList(Page<BlogDto> page, IndexVo indexVo);

    /**
     * 获取系统已发布博客中的前十个热门博客操作（按照浏览量倒叙排序）
     * @param hotStatus 热门状态（该方法只查询热门博客）
     * @return 博客列表
     */
    List<SortBlogDto> getTopTenHotBlogList(Integer hotStatus);

    /**
     * 获取当前系统时间所在日发布的前十个博客操作（安排发布时间倒叙排序）
     * @param startToDay 所在日开始时间
     * @param endTime    当前系统时间
     * @return 博客列表
     */
    List<SortBlogDto> getTopTenToDayBlogList(Date startToDay, Date endTime);

    /**
     * 获取系统已发布博客中的前十个被推荐博客操作（安排发布时间倒叙排序）
     * @param eliteStatus 推荐状态（该方法只查询被推荐博客）
     * @return 博客列表
     */
    List<SortBlogDto> getTopTenEliteBlogList(Integer eliteStatus);

    /**
     * 获取系统已发布博客的浏览次数总计操作
     * @return 总浏览次数
     */
    Long getIssueBlogViewNum();

    /**
     * 分页查询系统已发布博客列表
     * @param page mp分页对象
     * @return 博客列表
     */
    Page<BlogDto> getSynthesizeBlogList(Page<BlogDto> page, SortVo sortVo);

    /**
     * 分页查询参数时间范围内的系统已发布博客列表（时间范围：左闭右闭区间）
     * @param page      mp分页对象
     * @param sortVo    请求参数封装对象
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 博客列表
     */
    Page<BlogDto> getSynthesizeBlogList(Page<BlogDto> page, SortVo sortVo, Date startTime, Date endTime);

    /**
     * 分页查询系统热门博客列表
     * @param page      mp分页对象
     * @param sortVo    请求参数封装对象
     * @param hotStatus 博客热门状态[0-热门 1-正常]
     * @return 博客列表
     */
    Page<BlogDto> getHotBlogList(Page<BlogDto> page, SortVo sortVo, Integer hotStatus);

    /**
     * 分页查询系统推荐博客列表
     * @param page        mp分页对象
     * @param sortVo      请求参数封装对象
     * @param eliteStatus 博客推荐状态[0-推荐 1-正常]
     * @return 博客列表
     */
    Page<BlogDto> getEliteBlogList(Page<BlogDto> page, SortVo sortVo, Integer eliteStatus);

    /**
     * 分页查询用户所有已发布博客标题列表操作
     * @param blogFormVo 博客标题列表请求参数对象
     * @return 分页查询结果封装对象
     */
    PageDto<BlogDto> getBlogTitleList(BlogFormVo blogFormVo);

    /**
     * 统计系统已发布博客的点赞数量操作
     * @return 总点赞数
     */
    Long getIssueBlogLikeNum();

    /**
     * 获取用户已发布博客的数量
     * 查询指定时间范围内用户发布的博客数量
     * @param userId 用户id
     * @return 已发布博客数量
     */
    Long getUserIssueBlogNum(Long userId, Date startTime, Date endTime);

    /**
     * 获取用户已发布博客数量操作
     * @param userId 用户主键
     * @return 用户已发布博客数量
     */
    Long getBlogIssueCount(Long userId);

    /**
     * 判断已发布博客是否存在操作
     * @param blogId 博客主键
     */
    void existBlog(Long blogId);

    /**
     * 判断博客是否热门操作
     * @param blogId 博客主键
     * @return 判断结果
     */
    boolean isHotBlog(Long blogId);

    /**
     * 更新已发布博客操作
     * @param blogIssue 已发布博客对象
     */
    void edit(BlogIssueEntity blogIssue);

    /**
     * 重置所有已发布博客的热门状态操作
     */
    void resetIssueBlogHotStatus();

    /**
     * 批量更新已发布博客操作
     * @param blogIssueList 已发布博客对象列表
     */
    boolean batchUpdateBlogIssue(List<BlogIssueEntity> blogIssueList);

    /**
     * 删除已发布博客操作
     * @param blogIdList 博客主键列表
     */
    void deleteIssueBlog(List<Long> blogIdList);


}

